<?php
/**
 * CreateTime: 2023/11/15 15:36
 * User:LinQ
 *
 *  该辅助函数主要包含了对于常用加密算法和一些加密算法可能用到的 iv token 的一些的一些处理
 *
 *  get_iv | get_ase_key
 *
 *  aes_256_cbc_pkcs7
 *
 *  rsa
 *
 */

use JetBrains\PhpStorm\ArrayShape;

if (!function_exists('get_iv')) {
    /**
     * @param string $ivKey  根据传入的参数获取一个16个字符的 md5字符串 默认为 appKey
     * @return string
     */
    function get_iv(string $ivKey = ""): string {
        if(!$ivKey){
            $ivKey = env('APP_KEY');
        }
        return substr(md5($ivKey),0,16);
    }
}

if (!function_exists('get_ase_key')) {
    /**
     * @param string $aesKey  根据传入的参数获取一个16个字符的 md5字符串 如果没有传入参数 则自动获取appKey
     * @return string
     */
    function get_ase_key(string $aesKey = ''): string
    {
        if(!$aesKey){
            $aesKey = env('APP_KEY');
        }
        return substr(md5($aesKey),8,16);
    }
}


if (!function_exists('aes_256_cbc_pkcs7_encode')) {
    /**
     * @param string $data  需要加密的字符串
     * @param string $aesKey  需要使用的AesKey 默认 get_ase_key()
     * @param string $iv 需要使用的 iv 默认为 get_iv()
     * @param bool $canBase64 是否返回base64的结果 默认 true
     * @return string
     */
    function aes_256_cbc_pkcs7_encode(string $data,string $aesKey = '',string $iv = '',bool $canBase64 = true): string
    {
        if(!$aesKey){
            $aesKey = get_ase_key();
        }

        if(!$iv){
            $iv = get_iv();
        }

        $encryptInfo = openssl_encrypt($data, 'AES-256-CBC', $aesKey, OPENSSL_RAW_DATA, $iv);
        if($canBase64){
            return base64_encode($encryptInfo);
        }
        return $encryptInfo;
    }
}

if (!function_exists('rsa_encode')){
    /**
     * 用于使用公钥对数据进行加密
     * @param string $puKey 公钥可以通过 rsa_pu_pv_key() 获取
     * @param string $data 需要加密的字符串
     * @param bool $canBase64 是否需要 base64
     * @return string
     */
    function rsa_encode(string $puKey,string $data,bool $canBase64 = true) :string {
        // 加载公钥
        openssl_pkey_get_public($puKey);
        // 使用公钥加密数据
        openssl_public_encrypt($data, $encryptedData, $puKey);
        if($canBase64){
            return base64_encode($encryptedData);
        }
        return $encryptedData;
    }
}

if(!function_exists('hash_sign_x1')){
    /**
     * 默认的签名 会根据当前字符串生成一个hash编码 可以用来校验当前字符串是否被篡改
     * @param string $str
     * @return bool|string
     */
    function hash_sign_x1(string $str): bool|string
    {
        return hash_hmac('sha256',$str, 'FF4DF041BB8AA1531AB630167A778163');
    }
}

if (!function_exists('rsa_pu_pv_key')){
    /**
     * 获取公私钥键值对
     * @return array
     */
    #[ArrayShape(['pu_key' => "string", 'pv_key' => "string"])]
    function rsa_pu_pv_key() :array {
        // 生成 RSA 密钥对
        $privateKey = openssl_pkey_new([
            'private_key_bits' => 2048, // 密钥位数
            'private_key_type' => OPENSSL_KEYTYPE_RSA, // 密钥类型
        ]);
        // 提取私钥
        openssl_pkey_export($privateKey, $privateKeyString);
        // 提取公钥
        $publicKey = openssl_pkey_get_details($privateKey)['key'];
        return [
            'pu_key' => $publicKey,
            'pv_key' => $privateKeyString
        ];
    }
}




